package file_operation;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;

/**
 * java.io.File
 * File的每一个实例用于表示硬盘上的一个文件或目录(实际上是一个抽象路径)
 * 使用File我们可以:
 * 		1: 访问文件或目录的属性
 * 		2: 创建或删除文件和目录
 * 		3: 访问一个目录中的子项
 *
 * 但是不能用File访问文件内容
 *
 *
 * File		文件类
 * 是文件和目录路径名的抽象表示，主要用于文件和目录的创建、查找和删除等操作
 * 
 * 构造方法
 * public File(String pathname) 				通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
 * public File(String parent, String child) 	从父路径名字符串和子路径名字符串创建新的 File实例
 * public File(File parent, String child) 		从父抽象路径名和子路径名字符串创建新的 File实例
 * 
 * 常用方法
 * public String getAbsolutePath()				返回此File的绝对路径名字符串
 * public String getPath()						将此File转换为路径名字符串
 * public String getParent()					获取上层文件目录路径。若无，返回null
 * public File getParentFile()					获取上层文件目录路径。若无，返回null
 * public String getName()						返回由此File表示的文件或目录的名称
 * public long length()							返回由此File表示的文件的长度（大小），即文件的字节数(单位是字节)
 * boolean renameTo(File targetPathname)		重命名文件或目录【源文件必须存在，目标文件!exists()】
 * 								源文件和目标文件可以是不同的目录结构，从而可以实现文件移动和剪切
 *
 * 判断功能的方法
 * public boolean exists()						此File表示的文件或目录是否实际存在
 * public boolean isDirectory()					此File表示的是否为目录
 * public boolean isFile()						此File表示的是否为文件
 * public boolean isHidden()					判断文件或目录是否
 * public boolean canRead()						返回文件或目录是否可读
 * public boolean canWrite()					返回文件或目录是否可写
 * 
 * 创建删除功能的方法
 * public boolean createNewFile()				当且仅当具有该名称的文件尚不存在时，创建一个新的空文件
 * public boolean delete()						删除由此File表示的文件或目录
 * public boolean mkdir()						创建由此File表示的目录
 * public boolean mkdirs()						创建由此File表示的目录，包括任何必需但不存在的父目录
 * 
 * 目录的遍历
 * public String[] list()						返回一个String数组，表示该File目录中的所有子文件或目录
 * public File[] listFiles()					返回一个File数组，表示该File目录中的所有的子文件或目录
 * public File[] listFiles(FileFilter filter)	返回目录下通过过滤器过的文件及目录
 * */
public class FileDemo {
	public static void main(String[] args) throws IOException {
		String pathname = "D:\\directory\\filetest.txt";
		File file1 = new File(pathname);
		
		String parent = "D:\\directory\\d";
		String child = "filename.txt";
		File file2 = new File(parent, child);
		
		File parentDir = new File("D:\\directory");
		String child2 = "abc.txt";
		File file3 = new File(parentDir, child2);
		
		System.out.println(file1.getAbsolutePath());
		System.out.println(file2.getPath());
		System.out.println(file3.getName());
		System.out.println(file3.length());

		/**
		 * "./"		"."
		 * 表示当前目录
		 * 在IDEA中表示当前项目目录
		 *
		 * 在相对路径中最开始的“./”可以忽略不写，默认从"./"开始
		 * */
		File file = new File("./files/demo.txt");
		System.out.println("\n\n文件名：" + file.getName());
		System.out.println("绝对路径：" + file.getAbsolutePath());
		System.out.println("父路径：" + file.getParent());
		System.out.println("文件大小：" + file.length());
		BufferedReader br = BufferedReadWrite.getReader(file);
		String str;
		while ((str = br.readLine()) != null)
			System.out.println(str);
		System.out.println("\n\n----------------------------------\n");
		File file4 = new File(".");	// 当前目录（项目根目录）
		System.out.println("当前目录：" + file4.getAbsolutePath());
		File[] files = file4.listFiles(f -> f.getName().endsWith(".iml"));
		for (File temp : files)
			System.out.println(temp.getAbsolutePath());
		System.out.println("\n----------------------------------\n");
		files = file4.listFiles(f -> f.getName().contains("i"));
		for (File temp : files)
			System.out.println(temp.getAbsolutePath());
	}
}
